package day31.homework;

import java.io.Serializable;

/**
 * 老师类，用于封装老师的基本信息
 * 实现Serializable接口以便在网络中传输对象
 * 
 * JavaBean规范要求：
 * 1. 类必须是公共的（public）
 * 2. 所有属性必须是私有的（private）
 * 3. 为所有属性提供公共的getter和setter方法
 * 4. 必须有一个无参的构造方法
 * 5. 实现序列化接口（Serializable）
 * 
 * 序列化（Serialization）：
 * 序列化是将对象转换为字节流的过程，以便在网络上传输或保存到文件中
 * 反序列化是将字节流转换回对象的过程
 * 实现Serializable接口的类可以被序列化
 */
public class Teacher implements Serializable {
    // 序列化ID，用于版本控制
    // 当类的结构发生变化时，可以通过改变这个ID来标识不同的版本
    // 如果不显式声明，JVM会自动生成，但可能导致反序列化失败
    private static final long serialVersionUID = 1L;
    
    // 老师的姓名属性
    // private关键字表示该属性只能在本类中访问，外部无法直接访问
    private String name;
    
    // 老师的年龄属性
    private int age;
    
    // 老师的工资属性
    private double salary;
    
    /**
     * 默认构造函数
     * JavaBean要求必须提供无参构造方法
     * 如果类中没有定义任何构造方法，编译器会自动提供默认构造方法
     * 但一旦定义了有参构造方法，就必须手动提供无参构造方法
     */
    public Teacher() {
    }
    
    /**
     * 带参数的构造函数
     * 用于在创建对象时初始化所有属性
     * @param name 老师姓名
     * @param age 老师年龄
     * @param salary 老师工资
     */
    public Teacher(String name, int age, double salary) {
        // this关键字表示当前对象
        // 用于区分同名的成员变量和参数
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    
    /**
     * 获取老师姓名
     * getter方法用于获取私有属性的值
     * 方法名遵循JavaBean规范：get + 属性名（首字母大写）
     * @return 老师姓名
     */
    public String getName() {
        // 返回name属性的值
        return name;
    }
    
    /**
     * 设置老师姓名
     * setter方法用于设置私有属性的值
     * 方法名遵循JavaBean规范：set + 属性名（首字母大写）
     * @param name 老师姓名
     */
    public void setName(String name) {
        // this.name表示当前对象的name属性
        // name表示传入的参数
        this.name = name;
    }
    
    /**
     * 获取老师年龄
     * getter方法用于获取私有属性的值
     * @return 老师年龄
     */
    public int getAge() {
        // 返回age属性的值
        return age;
    }
    
    /**
     * 设置老师年龄
     * setter方法用于设置私有属性的值
     * @param age 老师年龄
     */
    public void setAge(int age) {
        // 将传入的age参数值赋给当前对象的age属性
        this.age = age;
    }
    
    /**
     * 获取老师工资
     * getter方法用于获取私有属性的值
     * @return 老师工资
     */
    public double getSalary() {
        // 返回salary属性的值
        return salary;
    }
    
    /**
     * 设置老师工资
     * setter方法用于设置私有属性的值
     * @param salary 老师工资
     */
    public void setSalary(double salary) {
        // 将传入的salary参数值赋给当前对象的salary属性
        this.salary = salary;
    }
    
    /**
     * 重写toString方法，用于输出老师信息
     * Object类是所有类的父类，toString()是Object类的方法
     * 重写该方法可以自定义对象的字符串表示形式
     * @return 格式化的老师信息字符串
     */
    @Override
    public String toString() {
        // 返回格式化的字符串，包含老师的所有信息
        // 字符串拼接使用+操作符
        return "Teacher{" + "name='" + name + '\'' + ", age=" + age +", salary=" + salary +'}';
    }
}